package lei.l_存储文件;


import com.alibaba.fastjson.JSON;

import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.StandardOpenOption;
import java.io.InputStream;


/**
 * @className: UniversalFileStorage
 * @author: xl
 * @date: 2025/7/26 15:17
 * @Version: 1.0
 * @description:
 */

public class UniversalFileStorage {


    /**
     * 最通用的文件存储方法
     * 一个方法搞定所有格式存储
     */
    public static boolean saveFile(Object data, String filePath) {
        try {
            Path path = Paths.get(filePath);
            if (data instanceof String) {
                // 文本数据 存储文本文件
                Files.write(path, ((String) data).getBytes(StandardCharsets.UTF_8),
                        StandardOpenOption.CREATE,
                        StandardOpenOption.WRITE);
            } else if (data instanceof byte[]) {
                // 字节数组（二进制数据） 存储二进制文件（图片、音频、Excel、Word等）
                Files.write(path, (byte[]) data,
                        StandardOpenOption.CREATE,
                        StandardOpenOption.WRITE);
            } else if (data instanceof InputStream) {
                // 输入流 从InputStream保存文件（适合大文件）
                Files.copy((InputStream) data, path,
                        java.nio.file.StandardCopyOption.REPLACE_EXISTING);
            } else {
                // 其他对象，尝试转换为JSON存储
                String jsonString = JSON.toJSONString(data, true);
                Files.write(path, jsonString.getBytes(StandardCharsets.UTF_8),//jsonString.getBytes(StandardCharsets.UTF_8)：将JSON字符串转换为UTF-8编码的字节数组
                        StandardOpenOption.CREATE,//StandardOpenOption.CREATE：如果文件不存在则创建
                        StandardOpenOption.WRITE);//StandardOpenOption.WRITE：以写入模式打开文件
            }
            System.out.println("文件保存成功: " + filePath);
            return true;
        } catch (Exception e) {
            System.err.println("保存文件失败: " + e.getMessage());
            return false;
        }
    }

    /**
     * 通用文件读取方法
     * 与saveFile方法对应，支持读取不同格式的文件
     */
    public static Object readFile(String filePath, Class<?> targetType) {
        try {
            Path path = Paths.get(filePath);

            if (!Files.exists(path)) {
                System.err.println("文件不存在: " + filePath);
                return null;
            }

            if (targetType == String.class) {
                // 读取文本文件
                return Files.readString(path);
            } else if (targetType == byte[].class) {
                // 读取二进制文件
                return Files.readAllBytes(path);
            } else {
                // 读取JSON文件并转换为指定对象
                try {
                    String content = Files.readString(path);
                    // 方案3: 显式创建ParserConfig并禁用ASM
                    com.alibaba.fastjson.parser.ParserConfig config = new com.alibaba.fastjson.parser.ParserConfig();
                    config.setAsmEnable(false); // 关键：禁用ASM
                    return JSON.parseObject(content, targetType, config);
                } catch (Exception parseException) {
                    System.err.println("JSON解析失败: " + parseException.getMessage());
                    parseException.printStackTrace();
                    return null;
                }
            }
        } catch (Exception e) {
            System.err.println("读取文件失败: " + e.getMessage());
            return null;
        }
    }


}
